Skip to main content
Version: 2.0

Hyperlink - Configuração e Programação

Lidando com ficheiros, dando seguimento à abordagem implementada em Upload, apresentamos uma tabela para listar as informações registadas através do formulário do tópico anterior. Ou seja, listamos o nome dos empregados e os respetivos curriculum vitae.

Cada currirulum vitae é representado na tabela por uma field do tipo link para ficheiro [assinalado com a seta na imagem] sobre os qual podemos clicar para aceder ao respetivo ficheiro. Hyperlink

A imagem abaixo é um exemplo de ficheiro pdf aberto em janela modal ao clicar sobre o link. Hyperlink Curriculum Vitae

1. Configurações no Design

Desenhamos nossa tabela com os três campos “name”, “curriculum_vitae” e “id” [hidden], e configuramos nosso link escolhendo, por exemplo, a forma de acesso que pretendemos [no nosso caso uma janela do tipo modal [2] ] e o valor da tag [1].

O Hyperlink é um field altamente configurável, como o Button, utilizado para acessar localizações dentro e fora do domínio da aplicação, porém, sem a execução de código Java. Logo, não corresponde a nenhum método no Controller.

Vamos agora ilustrar dois exemplos de uso deste field e pressupor, que a partir destes o desenvolvedor se possa orientar para outras situações que possam surgir.

  • Action – página requisitada/invocada pelo link;
  • Button [em HyperLink de Separator List] – bloqueia click sobre o link no formulário do SeparatorList;
  • Buttons Size – tamanho do botão;
  • Custom Action – permite personalizar o Action com um valor que não esteja presente no combobox desse campo;
  • Class – cor do botão. Pode também ser personalizado no separador STYLE;
  • Icon – ícone do botão;
  • Target – define o método de chamada utilizado para invocar o Action;
  • Show Header [em HyperLink de tabela] – limpa titulo coluna na tabela;
  • Refresh Parent [quando o Target selecionado é Modal / Submit modal] – atualiza a página ao fechar a janela [Modal] correspondente.

2. Programação

Vejamos agora o código java dos imports e métodos correspondentes a essa implementação a seguir.

Imports

/*----#start-code(packages\_import)----*/
import nosi.webapps.igrp.dao.CLob;
import nosi.webapps.igrp_tutorials.dao.Employee;
import java.util.List;
import java.util.ArrayList;
/*----#end-code----*/

Método actionIndex

/*----#start-code(packages\_import)----*/
List empolyeeList = new Employee().findAll();
if ( Core.isNotNull( empolyeeList ) ) {
List empTable = new ArrayList<>();
for ( Employee emp: empolyeeList ) {
EmployeeList.Employee_table row = new EmployeeList.Employee_table();
row.setId( emp.getId() );
row.setName( emp.getName() );
if ( emp.getFileId() != null )
row.setCurriculum_vitae( "igrp_tutorials",
"EmployeeList", "download&file_id="+ emp.getFileId() );
empTable.add( row );
}
model.setEmployee_table( empTable );
}
/*----#end-code----*/

Ao carregar dados na tabela configuramos o link para o acesso ao documento de cada linha.

Note que os valores do terceiro parâmetro do link ("download&file_id=") devem coincidir com o nome do método actionDownload e do parâmetro file_id assinalados em Custom actions para que a invocação deste ultimo seja realizada com sucesso.

Custom Actions

Finalmente, em Custom actions - espaço reservado no final do Controller, devemos implementar o método responsável pelo download do ficheiro no momento em que clicamos no link respetivo.

/*----#start-code(packages\_import)----*/
public Response actionDownload() throws IOException, IllegalArgumentException,
IllegalAccessException{
int fileId = Core.getParamInt( "file_id" );
CLob c = Core.getFile( fileId );
byte []content = c.getC_lob_content();
String name = c.getName();
String contentType = c.getMime_type();
boolean download = false;
return this.xSend( content, name, contentType, download );
}
/*----#end-code----*

Pedir o link de um ficheiro a partir do id String linkFile = Core.getLinkFile( String p_id );

Pedir o link de um ficheiro a partir do id String linkFile = Core.getLinkFile( int p_id );

Como complemento à abordagem do UPLOAD vamos implementar um Hiperlink através do qual vamos exibir um ficheiro previamente inserido na Base de dados. Então, vamos partir do princípio que tínhamos registado um objeto dao do tipo Person com name e idCurriculumVitae [id do ficheiro inserido na BD].

O Hyperlink está em um View e a partir dele podemos abrir em um Modal o Curriculum Vitae. Hyperlink em View Propriedades Hyperlink

Tendo nosso campo configurado conforme a acima, vamos receber o id do Person como parâmetro buscar o objeto na BD e exibir suas informações, necessitando então implementar os códigos que vêm a seguir.

O Hyperlink invocará o método actionDownload, que implementaremos em Custom Actions [final do Controller], responsável por trazer o ficheiro da BD para a página.

Método actionIndex

/*----#start-code(packages\_import)----*/
// receiving employee id as parameter
Integer employeeId = Core.getParamInt( "p_id" );
if( employeeId != null ){
// getting employee data from DB
Employee employee = new Employee().findOne( empployeeId );
// setting data in fields
if( employee != null && !employee.hasError() ){
model.setName( employee.getName() );
model.setCurriculum_vitae( "demo_app","Profile_page", "download&file_id="+ employee.getFileId() );
model.setCurriculum_vitae_desc( "Curriculum Vitae" ); // hyperlink text
}
}
/*----#end-code----*/

Notemos que os valores do terceiro parâmetro do Hiperlink ("download&file_id=") devem coincidir com o nome do método actionDownload e do parâmetro file_id assinalados em Custom actions para que a invocação deste ultimo seja realizada com sucesso.

Custom Actions

/*----#start-code(packages\_import)----*/
public Response actionDownload() throws IOException, IllegalArgumentException, IllegalAccessException{
int fileId = Core.getParamInt( "file_id" );
nosi.webapps.igrp.dao.CLob clob = Core.getFile( fileId );
byte []content = clob.getC_lob_content();
String name = clob.getName();
String contentType = clob.getMime_type();
boolean download = false;
return this.xSend( content, name, contentType, download );
}
/*----#end-code----*/

Podemos perceber a partir desta implementação que podíamos ter uma tabela com Hyperlinks para uma lista de ficheiros, cada um com o id do ficheiro correspondente.

A maioria dos Hyperlinks abrem locais do nosso domínio. Entretanto se pretendermos abrir Links externos devemos selecionar o Checkbox Custom Action [assinalado na Fig 6 com o número 1 ] e especificar o endereço pretendido no Text Custom Action [ numero 2 ], que então aparece e utilizar como Target [3] New Tab, Self, ou algum outro valor aplicável.

Propriedades Hyperlink 2

O Hyperlink configurado na imagem tem o aspeto da imagem abaixo e abre o endereço https://www.igrp.cv/

Hyperlink em Form

Se quisermos enviar parâmetros, basta utilizar no método actionIndex um código como o abaixo, sabendo que a tag é igrpweb:

/*----#start-code(packages\_import)----*/
view.igrpweb.addParam( "id", "1" );

Então o Hyperlink passaria a invocar https://www.igrp.cv/&id=1